package com.cty.advice;

import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * @Auther: cty
 * @Date: 2020/3/7 16:58
 * @Description:  通知类
 * @version: 1.0
 */

@Component  // 相当于<bean id="myadvice"></bean>
@Aspect  // 相当于<aop:aspect ref="myadvice"></aop:aspect>
public class MyAdvice {
    // 获取日志对象
    Logger log = Logger.getLogger(MyAdvice.class);

    // 无参前置通知
    @Before("com.cty.pojo.Demo.demo1()")
    public void myBefore(){
        log.debug("前置通知-AspectJ");
    }

//    // 单参前置通知
//    @Before("com.cty.pojo.Demo.demo2(String) and args(name1)")
//    public void myBefore2(String name1){
//        log.debug("前置通知2-AspectJ："+name1);
//    }

//    // 多参前置通知
//    @Before("com.cty.pojo.Demo.demo3(String, int) and args(name, age)")
//    public void myBefore3(String name,int age){
//        log.debug("前置通知3-AspectJ："+name+" "+age);
//    }

    // 无参后置通知（无异常时执行）
    @AfterReturning("com.cty.pojo.Demo.demo1()")
    public void myAftering(){
        log.debug("后置通知ing-AspectJ");
    }

    // 无参后置通知（有无异常都执行）
    @After("com.cty.pojo.Demo.demo1()")
    public void myAfter(){
        log.debug("后置通知-AspectJ");
    }

//    // 单参后置通知（有无异常都执行）
//    @After("com.cty.pojo.Demo.demo2(String) and args(name1)")
//    public void myAfter2(String name1){
//        log.debug("后置通知2-AspectJ："+name1);
//    }
//
//    // 多参后置通知（有无异常都执行）   ? 如何获取返回对象？？？
//    @After("com.cty.pojo.Demo.demo3(String, int) and args(name, age)")
//    public void myAfter3(String name, int age){
//        log.debug("后置通知3-AspectJ："+name+" "+age);
//    }

    @AfterThrowing("com.cty.pojo.Demo.demo1()")
    public void myThrows(){
        log.debug("异常通知-AspectJ");
    }

    @Around("com.cty.pojo.Demo.demo1()")
    public Object myAround(ProceedingJoinPoint p) throws Throwable{
        log.debug("前置环绕通知-AspectJ");
        Object result = p.proceed();
        log.debug("后置环绕通知-AspectJ");

        return result;
    }
}
